<?php
class Arm_Page_Sql_Pdo_Mysql extends Arm_Db_Sql_Mysql
{
    /**
     * Таблица страниц.
     * @var string
     */
    const ADMIN_PAGE = 'admin_page';
    
    /**
     * Таблица с переводами страниц
     * @var string
     */
    const ADMIN_PAGE_TRANSLATE = 'admin_page_translate';
    
    
    /**
     * Arm_Translate_Sql_Pdo_Mysql
     * @var Arm_Translate_Sql_Pdo_Mysql
     */
    protected $_translateSql = null;
    
    public function init ()
    {
        $this->_translateSql = Arm_Translate::getInstance()->getSql();
    }
    
    /**
     * Создает страницу
     * @param array $data
     */
    public function create ($data, $lang=null)
    {
        $this->getDb()->beginTransaction();
        try {
            // Проверим может есть уже страница записываем только языковую страницу
            $id = $this->getIdPageUrl($data['uri']);
            if($id === false) {
            $this->getDb()->insert(self::ADMIN_PAGE, $this->_getArrayColumTable(self::ADMIN_PAGE, $data));
            $id = $this->getDb()->lastInsertId(self::ADMIN_PAGE);
            }
            $this->_translateSql->insertTranslate(self::ADMIN_PAGE, $id, $data, $lang);
            $this->getDb()->commit();
        } catch (Exception $e) {
            $this->getDb()->rollBack();
            throw $e;
        }
        return $id;
    }
    
    /**
     * Обновления страници
     * @param int $idPage
     * @param array $data
     */
    public function updatePage($idPage, $data)
    {
       $this->getDb()->beginTransaction();
        try {
            $dataPage = $this->_getArrayColumTable(self::ADMIN_PAGE, $data);
            if($dataPage !== array()) {
            $this->getDb()->update(self::ADMIN_PAGE, $this->_getArrayColumTable(self::ADMIN_PAGE, $data), $this->getDb()->quoteInto('id=?', $idPage));
            }
            $this->_translateSql->updateTranslate(self::ADMIN_PAGE, $idPage, $data);
            $this->getDb()->commit();
        } catch (Exception $e) {
            $this->getDb()->rollBack();
            throw $e;
        }
        return $idPage;
    }
    
    /**
     * Вернет id страницы по ее урлу.
     * @param string $url
     * @return int|false
     */
    public function getIdPageUrl($url)
    {
      $select = $this->_getSelect();
      $select->from(self::ADMIN_PAGE, 'id');
      $select->where(Arm_Page::URI . '=?', $url);
      return $this->getDb()->fetchOne($select);
    }
    
    /**
     * Получения страницы.
     * @param int $id
     */
    public function getPage($id)
    {
      $select = $this->_getSelect();
      $select->from(self::ADMIN_PAGE);
      $select->where('id =?', $id);
      $this->_translateSql->getSelectTranslate(self::ADMIN_PAGE, 'id', $select);
      return $this->getDb()->fetchRow($select);
    }
    
    /**
     * Удаления страницы
     * @param int $idPage
     */
    public function deletePage($idPage)
    {
        $idPage = (array) $idPage;
        $this->getDb()->delete(self::ADMIN_PAGE, $this->getDb()->quoteInto('id in(?)', $idPage));
        $this->_translateSql->deleteTranslate(self::ADMIN_PAGE, $idPage);
        return;
    }
    
    /**
     * Удаления страниц принадлежащих модулю
     * @param int $idModule
     */
    public function deletePageModule($idModule)
    {
        // получаем id страниц модуля.
        $select = $this->_getSelect();
        $select->from(self::ADMIN_PAGE, 'id');
        $select->where('id_module=?', $idModule);
        $idPage = $this->getDb()->fetchCol($select);
        if($idPage === array() or $idPage === false) {
            return;
        }
        $this->getDb()->delete(self::ADMIN_PAGE, $this->getDb()->quoteInto('id in(?)', $idPage));
        $this->_translateSql->deleteTranslate(self::ADMIN_PAGE, $idPage);
        return;
    }
    
    /**
     * Получения всех страниц в системе или модуля
     * 
     * @param int|null $idModule если null все страницы в системе
     * @param string|null $lang если null язык установиться текущий.
     * @return array
     */
    public function getPages($idModule = null, $lang = null)
    {
      $select = $this->_getSelect();
      $select->from(self::ADMIN_PAGE);
      if($idModule !== null) {
         $select->where('id_module =?', $idModule);
      }
      $this->_translateSql->getSelectTranslate(self::ADMIN_PAGE, 'id', $select, $lang);
      return $this->getDb()->fetchAll($select);
    }
    

    
    
    /**
     * Удаления страниц которые не имеют свзяей с таблицой навигации.
     */
    public function deletePageNotNavigation()
    {
       $tn = Arm_Navigation_Sql_Pdo_Mysql::ADMIN_NAVIGATION_DATA;
       $select = $this->_getSelect();
       $select->from($tn, 'uri');
       $uriNav = $this->getDb()->fetchCol($select);

       $select = $this->_getSelect();
       $select->from(self::ADMIN_PAGE, 'id');
       if($uriNav !== array()) {
         $select->where('uri not in (?)', $uriNav);
       }
       $id = $this->getDb()->fetchCol($select);
       if($id === array()) {
           return;
       }
       $this->deletePage($id);
       return;
    }
    
   
}